-- AreaTaskM
-- Created by chengb Feb/7/2015
-- 区域任务模块

module("AreaTaskM", package.seeall);

-- 区域任务奖励配置
local areaTaskBonusTable = {};

-- 载入配置表
local _init = false;
local loadCsv = function()
    if _init then return end
    _init = true;

    -- 转换下spell信息表
    areaTaskBonusTable = {};
    local area_task_bonus_CSV = get_area_task_bonus_CSV();
    for i = 1, #area_task_bonus_CSV do
        areaTaskBonusTable[area_task_bonus_CSV[i].area] = area_task_bonus_CSV[i];
    end

    area_task_bonus_CSV = {};
end

-- 初始化
function init()
    loadCsv();
end

---------------------
-- 获取某个区域所有的区域任务
-- @param area   区域id 
function getAreaTasks(area)
    local taskList = TaskM.getTasksByArea(area);
    local resultList = {};
    
    if not taskList then
        return resultList;
    end
    
    for _, taskInfo in pairs(taskList) do
        if taskInfo["repeat"] ~= 1 then
            table.insert(resultList, taskInfo);
        end
    end
    return resultList;
end

---------------------
-- 领取区域任务的奖励
-- @param area   区域id
function takeBonus(area)
    -- 已经领取过奖励了
    if isDone(area) then
        return false;
    end
    
    -- 是否完成了该区域的区域任务
    if true ~= isFinished(area) then
        return false;
    end
    
    -- 执行奖励
    if not doBonus(area) then
        return false;
    end
    
    -- 标记改区域任务已圆满完成
    local areaTaskDone = ME.user.dbase:query("area_task_done", {});
    areaTaskDone[area] = 1;
    ME.user.dbase:set("area_task_done", areaTaskDone);
    
    return true;
end

----------------------------
-- 某区域任务是已经圆满完成（领取了奖励）
-- @param area   区域id
function isDone(area)
    local areaTaskDone = ME.user.dbase:query("area_task_done", {});
    if not areaTaskDone[area] then
        return false;
    end 

    return true;
end

---------------------------
-- 是否完成了指定区域的区域任务
-- @param area   区域id
function isFinished(area)
    -- 获取该区域所有的区域任务
    local taskList = getAreaTasks(area);
    if type(taskList) ~= "table" or #taskList == 0 then
        return false;
    end
    
    -- 遍历任务列表，逐个判断是否已完成
    for _, taskInfo in pairs(taskList) do
        -- 只要有一个子任务未完成，就算未完成
        if not TaskM.isFinished(taskInfo["id"]) then
            return false;
        end
    end
    
    return true;
end

-----------------------------
-- 是否是区域任务
-- @param taskId   任务id
function isAreaTask(taskId)
    if TaskM.query(taskId, "type") == TASK_TYPE_AREA then
    	return true;
    end
    return false;
end

---------------------------
-- 计算区域任务的奖励
-- @param area 区域id
function calcAreaTaskBonus(area)
    -- 获取奖励配置
    local bonusConfig = areaTaskBonusTable[area];
    if not bonusConfig then
        assert(false, "获取不到区域任务奖励配置。");
        return {};
    end

    -- 调用公式
    local fomulaName = bonusConfig["bonus_formula"];
    local bonusList = {};
    if type(fomulaName) == 'string' and string.len(fomulaName) > 0 then
        bonusList = FormulaM.invoke(fomulaName, ME.user, area, bonusConfig["bonus_args"]);
    end
    
    return bonusList;
end

----------------------
-- 获取区域任务日志
-- @param taskId 任务id
function getTaskLog(taskId)
    local logFormat = TaskM.query(taskId, "log");
    local progress = TaskM.getProgress(taskId);
    local require = TaskM.query(taskId, "require");
    return string.format(logFormat, progress, require);
end

-- 执行区域任务的奖励
function doBonus(area)
    -- 计算奖励
    local bonusList = calcAreaTaskBonus(area);
    
    if #bonusList == 0 then
        return false;
    end
    
    for _, arr in pairs(bonusList) do
        BonusM.doBonus(arr);
    end
    
    return true;
end

